import store from '@/store';
import { AnswerType } from '@/utils/constant';
import { MessageBo, OllamaMessages } from '@/interface/home';

/**
 * 滚动聊天容器到底部
 * @description 支持两种滚动模式：smooth 和 auto
 * @param time 滚动时间
 * @returns void
 */

export const scrollToBottom = (time = 100): void => {
  const messages = document.querySelector('.chat-main-content');
  if (!messages) return;
  setTimeout(() => {
    messages.lastElementChild?.scrollIntoView({
      behavior: 'smooth',
      block: 'end',
    });
  }, time);
};

/**
 * 监听消息容器高度变化
 * @description 监听消息容器高度变化
 * @returns void
 */
export const observeMessagesHeight = (): void => {
  const messages = document.querySelector('.chat-main-content');
  if (!messages) return;

  // 使用 MutationObserver 监听子元素变化
  const observer = new MutationObserver(() => {
    scrollToBottom();
  });
  // 配置观察选项：监听子元素列表变化
  observer.observe(messages, {
    childList: true, // 观察直接子节点的变化
    subtree: true, // 观察所有后代节点的变化
  });

  store.state.resizeObserver = observer;
};

/**
 * @description 获取最后一个小标
 * @param {string} type
 * @returns number
 */
export const getLastQaIndex = (type: AnswerType): number => {
  let lastIndex = -1;
  for (let i = store.state.messages.length - 1; i >= 0; i--) {
    if (store.state.messages[i].answerType === type) {
      lastIndex = i;
      break;
    }
  }
  return lastIndex;
};

/**
 * @description 格式化数据
 * @param {string[]} data
 * @returns string
 */
export const formatData = (data: string[]): string =>
  data.map((item: string) => JSON.parse(item).message.content).join('');

/**
 * @description 设置问答数据
 * @param {MessageBo[]} messages
 * @returns OllamaMessages[]
 */
export const setQuesMessages = (messages: MessageBo[]): OllamaMessages[] => {
  return messages.map((item: MessageBo) => ({
    content: item.answer,
    role: item.answerType === AnswerType.USER ? AnswerType.USER : AnswerType.ASSISTANT,
  }));
};

/**
 * @description 从剪贴板粘贴文本到当前选择的位置
 * @param event 剪贴板事件对象，通常是在粘贴事件（如 'paste' 事件）中触发时传递的
 * @returns 粘贴的文本数据，如果未成功获取数据则返回空字符串
 */
export const pasteFromClipboardToSelection = (event: ClipboardEvent): string => {
  // 检查 clipboardData 是否存在
  const clipboardData = event.clipboardData;
  if (!clipboardData) return '';

  // 获取剪贴板中的纯文本数据
  const pastedData = clipboardData.getData('text/plain');
  if (!pastedData) return '';

  // 如果有选中文本区域，则将粘贴内容插入到选中位置
  const selection = window.getSelection();
  if (selection && selection.rangeCount > 0) {
    const range = selection.getRangeAt(0);
    range.deleteContents(); // 删除选中的内容
    const textNode = document.createTextNode(pastedData); // 创建新的文本节点
    range.insertNode(textNode); // 插入新内容
    range.setStartAfter(textNode); // 设置光标位置到新内容之后
    selection.removeAllRanges(); // 清除所有选中范围
    selection.addRange(range); // 添加新的选中范围
  }

  return pastedData;
};
